package com.shark.teach;

import java.util.*;
import java.util.concurrent.*;

/**
 * @auther shark
 * @create 2024-08-06 8:28
 */
public class NotSafeDemo
{
    //证明集合不安全
    public static void main(String[] args)
    {
        mapNotSafe();
    }

    private static void mapNotSafe()
    {
        Map<String,String> map = new ConcurrentHashMap();//Collections.synchronizedMap(new HashMap<>());//new HashMap<>();

        for (int i = 1; i <=100; i++) {
            new Thread(() -> {
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,6));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }

    private static void setNotSafe()
    {
        Set<String> set = new CopyOnWriteArraySet();//Collections.synchronizedSet(new HashSet<>());//new HashSet<>();

        for (int i = 1; i <=100; i++) {
            new Thread(() -> {
                set.add(UUID.randomUUID().toString().substring(0,6));
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }

    private static void listNotSafe()
    {
        List<String> list = new CopyOnWriteArrayList();//Collections.synchronizedList(new ArrayList<>());//new Vector<>();new ArrayList<>();

        for (int i = 1; i <=100; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0,6));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}
//java.util.ConcurrentModificationException


//读写分离+写时复制









/*CopyOnWrite容器即写时复制的容器。往一个容器添加元素的时候，不直接往当前容器Object[]添加，
        而是先将当前容器Object[]进行Copy，复制出一个新的容器Object[] newElements，
        然后向新的容器Object[] newElements里添加元素。
        添加元素后，再将原容器的引用指向新的容器setArray(newElements)。
        这样做的好处是可以对CopyOnWrite容器进行并发的读，而不需要加锁，因为当前容器不会添加任何元素。
        所以CopyOnWrite容器也是一种读写分离的思想，读和写不同的容器。*/
